﻿#include <algorithm>
#include <iostream>
#include <vector>



using namespace std;


/*
https://www.papamelon.com/problem/356

有 N 头奶牛。
如果两头奶牛出现在同一个电影中，它们之间的度等于 1。
如果 A,B 出现在同一个电影，B,C 出现在另一个电影，那么 A,C 之间的度等于 2。
现在一共有 M 个电影，给出每个电影中出现了哪些奶牛，这样我们就可以知道不同奶牛之间的度。
现在，让我们确定一个特殊的奶牛，计算这头奶牛到其余每个奶牛的最小度，将这些最小度相加求和，然后再求平均值。
为了使得这个平均值最小，让我们确定一个最优特殊奶牛，计算出最小平均值。平均值可能是一个浮点数，将其乘上 100 然后输出整数部分。

输入
第一行输入两个整数 N,M(2≤N≤300,1≤M≤10000)，表示奶牛数量和电影数量，奶牛从 1∼N 进行编号
接下来 M 行，每行是一部电影的信息：
第一个整数 k(2≤k≤n)，表示该电影出现了 k 头奶牛；后面紧跟 k 个整数，表示每头奶牛的编号
输出
一个整数，表示最小平均值（乘上 100 后的结果）
样例 1
输入
4 2
3 1 2 3
2 3 4
输出
100
*/


const int  N = 10010;
const int  M = 310;

int gra[M][M];
int n, m;

void floyd() {
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				gra[i][j] = min(gra[i][j], gra[i][k] + gra[k][j]);
			}
		}
	}
}

int CalcAve(int x) {
	double t = 0.0;
	for (int i = 1; i <= n; i++) {
		t += gra[x][i];
	}

	return (int)(t / (n-1) * 100);
}

int main()
{
	cin >> n >> m;
	memset(gra,0x3f,sizeof gra);
	for (int i = 1; i <= n; i++) { gra[i][i] = 0; }
	for (int i = 0; i < m; i++) {
		int k; cin >> k; vector<int> nums(k);
		for (int j = 0; j < k; j++) {
			cin >> nums[j];
		}
		//根据名单进行制图
		for (int j = 0; j < nums.size(); j++) {
			for (int k = j + 1; k < nums.size(); k++) {
				int a = nums[j]; int b = nums[k];
				if (a != b) { gra[a][b] = 1; gra[b][a] = 1; }
			}
		}
	}

	floyd();

	int ans = (int)1e8;
	for (int i = 1; i <= n; i++) {
		int t = CalcAve(i);
		ans = min(ans,t);
	}

	cout << ans << endl;

	return 0;
}

 